package com.cargo.base.utils;

import org.apache.poi.ss.usermodel.Cell;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.MappingJsonFactory;
import org.codehaus.jackson.type.TypeReference;

import java.io.File;
import java.io.FileOutputStream;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CommonUtil {
	
	/**
	 * Object对象转换为JSON格式
	 * 
	 * 例如List对象、JavaBean对象、JavaBean对象数组、Map对象、List Map对象
	 * 
	 * @param object
	 *            传入的Object对象
	 * @return object的JSON格式字符串
	 */
	public static String toJson(Object object) {

		// Jackson方式转换为Json
		MappingJsonFactory f = new MappingJsonFactory();
		StringWriter sw = new StringWriter();

		try {
			JsonGenerator generator = f.createJsonGenerator(sw);
			generator.writeObject(object);
			generator.close();

		} catch (Exception e) {
			return "";
		}
		return sw.toString();

	}

	/**
	 * JSON转换为Object对象
	 * 
	 * @param jsonString
	 *            JSON字符串
	 * @param c
	 *            要转换成的类的类型
	 * @return Object对象
	 */
	public static <T> T jsonToObject(String jsonString, Class<T> c) {
		try {
			if (!CheckUtil.checkObj(jsonString)) {
				return null;
	
			} else {
	
				// Jackson方式将Json转换为对象
				MappingJsonFactory f = new MappingJsonFactory();
				JsonParser parser = f.createJsonParser(jsonString);
				return parser.readValueAs(c);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 数组格式JSON串转换为ObjectList对象
	 * 
	 * @param <T>
	 * @param jsonString
	 *            JSON字符串
	 * @param tr
	 *            TypeReference,例如: new TypeReference< List<Album> >(){}
	 * @return ObjectList对象
	 */
	public static <T> T jsonToGenericObject(String jsonString,
			TypeReference<T> tr) {
		try {
			if (!CheckUtil.checkObj(jsonString)) {
				return null;
	
			} else {
				// Jackson方式将Json转换为对象
				MappingJsonFactory f = new MappingJsonFactory();
				JsonParser parser = f.createJsonParser(jsonString);
				return parser.readValueAs(tr);
			}
		} catch (Exception e) {
			return null;
		}
	}
	
	/**
	 * 
	 * hangeToBig:小写转换成大写
	 * 
	 * @param value
	 * @return
	 * @return :String
	 * @Creator:wizard
	 * @Date:2016年8月17日 下午5:33:28
	 */
	public static String hangeToBig(double value) {
		if(value == 0){
			return "零圆整";
		}
		char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
		char[] vunit = { '万', '亿' }; // 段名表示
		char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
		long midVal = (long) (value * 100); // 转化成整形
		String valStr = String.valueOf(midVal); // 转化成字符串
		String head = valStr.substring(0, valStr.length() - 2); // 取整数部分
		String rail = valStr.substring(valStr.length() - 2); // 取小数部分
		String prefix = ""; // 整数部分转化的结果
		String suffix = ""; // 小数部分转化的结果
		// 处理小数点后面的数
		if (rail.equals("00")) { // 如果小数部分为0
			suffix = "整";
		} else {
			suffix = digit[rail.charAt(0) - '0'] + "角" + digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
		}
		// 处理小数点前面的数
		char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
		char zero = '0'; // 标志'0'表示出现过0
		byte zeroSerNum = 0; // 连续出现0的次数
		for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字
			int idx = (chDig.length - i - 1) % 4; // 取段内位置
			int vidx = (chDig.length - i - 1) / 4; // 取段位置
			if (chDig[i] == '0') { // 如果当前字符是0
				zeroSerNum++; // 连续0次数递增
				if (zero == '0') { // 标志
					zero = digit[0];
				} else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
					prefix += vunit[vidx - 1];
					zero = '0';
				}
				continue;
			}
			zeroSerNum = 0; // 连续0次数清零
			if (zero != '0') { // 如果标志不为0,则加上,例如万,亿什么的
				prefix += zero;
				zero = '0';
			}
			prefix += digit[chDig[i] - '0']; // 转化该数字表示
			if (idx > 0)
				prefix += hunit[idx - 1];
			if (idx == 0 && vidx > 0) {
				prefix += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿
			}
		}
		if (prefix.length() > 0)
			prefix += '圆'; // 如果整数部分存在,则有圆的字样
		return prefix + suffix; // 返回正确表示
	}
	
	/**
	 * UuidUtils:uuid工具类
	 * 
	 * @Project Name:cargo
	 * @File Name:UuidUtils.java
	 * @Package Name:com.cargo.utils
	 * @Creator:wizard
	 * @Date:2016年4月14日下午6:11:32
	 */
	public static String getUUid() {
		return UUID.randomUUID().toString().replaceAll("-", "");
	}
	
	public static void main(String[] args)
    {
        Calendar calendar = Calendar.getInstance();
        Date date = new Date(System.currentTimeMillis());
        calendar.setTime(date);
//        calendar.add(Calendar.WEEK_OF_YEAR, -1);
        calendar.add(Calendar.YEAR, 1);
        date = calendar.getTime();
        System.out.println(date);
    }


	public static String getValue(Cell xssfRow) {
		try{
			if(!CheckUtil.checkObj(xssfRow)){
				return "";
			}
			if (xssfRow.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
				return String.valueOf(xssfRow.getBooleanCellValue());
			} else if (xssfRow.getCellType() == Cell.CELL_TYPE_NUMERIC) {
				return String.valueOf(xssfRow.getNumericCellValue());
			} else {
				return String.valueOf(xssfRow.getStringCellValue());
			}
		} catch (Exception e) {
			return null;
		}
	}
	
	
	/**
	 * 判断是否为中文字符
	 * @param value
	 * @return
	 */
	public static boolean isChineseChar(String str){
	       boolean temp = false;
	       Pattern p= Pattern.compile("[\u4e00-\u9fa5]");
	       Matcher m=p.matcher(str);
	       if(m.find()){ 
	           temp =  true;
	       }
	       return temp;
	   }
	
	
	
	/**
	 * 判断是否为英文字符
	 * @param value
	 * @return
	 */
	public static boolean ji(String s) {
		 boolean temp = false;
	       Pattern p= Pattern.compile("[/^[A-Za-z]+$/]");
	       Matcher m=p.matcher(s);
	       if(m.find()){ 
	           temp =  true;
	       }
	       return temp;
	}
	
	
	/**
	 * 判断是否为数字
	 * @param value
	 * @return
	 */
	public static boolean isInteger(String value) {
		try {
			Integer.parseInt(value);
			return true;
		} catch (NumberFormatException e) {
			return false;
		}
	}
	
	
	public static void write(String path, List<String> wenjian){
		
		FileOutputStream out = null;
	
	    try {   
	
	        out = new FileOutputStream(new File(path));
	
	
	        for (int i = 0; i < wenjian.size(); i++) {   
	
	            out.write(wenjian.get(i).getBytes());   
	
	        }   
	
	        out.close();   
	
	
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static boolean isPhone(String str) {
		try{
			if (!CheckUtil.checkObj(str)) {
				return false;
			}
			Pattern pattern = Pattern.compile("^(1[3,4,5,7,8][0-9])\\d{8}$");
			Matcher matcher = pattern.matcher(str);
			boolean b = matcher.matches();
			return b;
		} catch (Exception e) {
			return false;
		}
	}
	
	/**
	 * ConvertObjToMap:(需要转json格式数据).
	 * @param obj
	 * @return 
	 * @return :Map<String,String> 
	 * @Creator:wizard
	 * @Date:2017年8月4日 下午4:54:44
	 */
	public static Map<String,String> ConvertObjToMap(Object obj) {
		Map<String, String> reMap = new HashMap<String, String>();
		try {
			if (obj == null)
				return null;
			Field[] fields = obj.getClass().getDeclaredFields();
		
			for (int i = 0; i < fields.length; i++) {
				try {
					Field f = obj.getClass().getDeclaredField(fields[i].getName());
					f.setAccessible(true);
					Object o = f.get(obj);
					if(o != null)
						reMap.put(fields[i].getName(), o.toString());
				} catch (NoSuchFieldException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return reMap;
	}
	
	/**
	 * 
	 * idsConver2List:ids转为List
	 * 
	 * @param ids
	 *            eg:ids=1,2,3
	 * @return
	 * @return :List<Integer>
	 * @Creator:YangJie
	 * @Date:2017年4月13日 下午3:17:53
	 */
	public static List<Integer> idsConver2List(String ids) {
		List<Integer> idList = new ArrayList<>();
		// 分隔字符串，组装为idList
		if (CheckUtil.isNotEmpty(ids)) {
			String[] idsArr = ids.split(",");
			for (String idStr : idsArr) {
				try {
					Integer id = Integer.valueOf(idStr);
					idList.add(id);
				} catch (Exception e) {
				}
			}
		}
		return idList;
	}
}
